{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "*Python Machine Learning 3rd Edition* by [Sebastian Raschka](https://sebastianraschka.com) & [Vahid Mirjalili](http://vahidmirjalili.com), Packt Publishing Ltd. 2019\n",
    "\n",
    "Code Repository: https://github.com/rasbt/python-machine-learning-book-3rd-edition\n",
    "\n",
    "Code License: [MIT License](https://github.com/rasbt/python-machine-learning-book-3rd-edition/blob/master/LICENSE.txt)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Chapter 13: Parallelizing Neural Network Training with TensorFlow  (Part 2/2)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Note that the optional watermark extension is a small IPython notebook plugin that I developed to make the code reproducible. You can just skip the following line(s)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Sebastian Raschka & Vahid Mirjalili \n",
      "last updated: 2019-12-06 \n",
      "\n",
      "numpy 1.17.4\n",
      "scipy 1.3.1\n",
      "matplotlib 3.1.0\n",
      "tensorflow 2.0.0\n"
     ]
    }
   ],
   "source": [
    "%load_ext watermark\n",
    "%watermark -a \"Sebastian Raschka & Vahid Mirjalili\" -u -d -p numpy,scipy,matplotlib,tensorflow"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Building a neural network model in TensorFlow"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### The TensorFlow Keras API (tf.keras)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Building a linear regression model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "import tensorflow as tf\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "X_train = np.arange(10).reshape((10, 1))\n",
    "y_train = np.array([1.0, 1.3, 3.1,\n",
    "                    2.0, 5.0, 6.3,\n",
    "                    6.6, 7.4, 8.0,\n",
    "                    9.0])\n",
    "\n",
    "\n",
    "plt.plot(X_train, y_train, 'o', markersize=10)\n",
    "plt.xlabel('x')\n",
    "plt.ylabel('y')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "X_train_norm = (X_train - np.mean(X_train))/np.std(X_train)\n",
    "\n",
    "ds_train_orig = tf.data.Dataset.from_tensor_slices(\n",
    "    (tf.cast(X_train_norm, tf.float32),\n",
    "     tf.cast(y_train, tf.float32)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"my_model\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "Total params: 2\n",
      "Trainable params: 2\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "class MyModel(tf.keras.Model):\n",
    "    def __init__(self):\n",
    "        super(MyModel, self).__init__()\n",
    "        self.w = tf.Variable(0.0, name='weight')\n",
    "        self.b = tf.Variable(0.0, name='bias')\n",
    "\n",
    "    def call(self, x):\n",
    "        return self.w*x + self.b\n",
    "\n",
    "\n",
    "model = MyModel()\n",
    "\n",
    "model.build(input_shape=(None, 1))\n",
    "model.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<tf.Tensor: id=33, shape=(), dtype=float32, numpy=0.25>"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "def loss_fn(y_true, y_pred):\n",
    "    return tf.reduce_mean(tf.square(y_true - y_pred))\n",
    "\n",
    "\n",
    "## testing the function:\n",
    "yt = tf.convert_to_tensor([1.0])\n",
    "yp = tf.convert_to_tensor([1.5])\n",
    "\n",
    "loss_fn(yt, yp)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "def train(model, inputs, outputs, learning_rate):\n",
    "    with tf.GradientTape() as tape:\n",
    "        current_loss = loss_fn(model(inputs), outputs)\n",
    "    dW, db = tape.gradient(current_loss, [model.w, model.b])\n",
    "    model.w.assign_sub(learning_rate * dW)\n",
    "    model.b.assign_sub(learning_rate * db)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch    0 Step  0 Loss 43.5600\n",
      "Epoch   10 Step 100 Loss 0.7530\n",
      "Epoch   20 Step 200 Loss 20.1759\n",
      "Epoch   30 Step 300 Loss 23.3976\n",
      "Epoch   40 Step 400 Loss 6.3481\n",
      "Epoch   50 Step 500 Loss 4.6356\n",
      "Epoch   60 Step 600 Loss 0.2411\n",
      "Epoch   70 Step 700 Loss 0.2036\n",
      "Epoch   80 Step 800 Loss 3.8177\n",
      "Epoch   90 Step 900 Loss 0.9416\n",
      "Epoch  100 Step 1000 Loss 0.7035\n",
      "Epoch  110 Step 1100 Loss 0.0348\n",
      "Epoch  120 Step 1200 Loss 0.5404\n",
      "Epoch  130 Step 1300 Loss 0.1170\n",
      "Epoch  140 Step 1400 Loss 0.1195\n",
      "Epoch  150 Step 1500 Loss 0.0944\n",
      "Epoch  160 Step 1600 Loss 0.4670\n",
      "Epoch  170 Step 1700 Loss 2.0695\n",
      "Epoch  180 Step 1800 Loss 0.0020\n",
      "Epoch  190 Step 1900 Loss 0.3612\n"
     ]
    }
   ],
   "source": [
    "tf.random.set_seed(1)\n",
    "\n",
    "num_epochs = 200\n",
    "log_steps = 100\n",
    "learning_rate = 0.001\n",
    "batch_size = 1\n",
    "steps_per_epoch = int(np.ceil(len(y_train) / batch_size))\n",
    "\n",
    "\n",
    "ds_train = ds_train_orig.shuffle(buffer_size=len(y_train))\n",
    "ds_train = ds_train.repeat(count=None)\n",
    "ds_train = ds_train.batch(1)\n",
    "\n",
    "Ws, bs = [], []\n",
    "\n",
    "for i, batch in enumerate(ds_train):\n",
    "    if i >= steps_per_epoch * num_epochs:\n",
    "        break\n",
    "    Ws.append(model.w.numpy())\n",
    "    bs.append(model.b.numpy())\n",
    "\n",
    "    bx, by = batch\n",
    "    loss_val = loss_fn(model(bx), by)\n",
    "\n",
    "    train(model, bx, by, learning_rate=learning_rate)\n",
    "    if i%log_steps==0:\n",
    "        print('Epoch {:4d} Step {:2d} Loss {:6.4f}'.format(\n",
    "              int(i/steps_per_epoch), i, loss_val))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Final Parameters: 2.6576622 4.8798566\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 936x360 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "print('Final Parameters:', model.w.numpy(), model.b.numpy())\n",
    "\n",
    "\n",
    "X_test = np.linspace(0, 9, num=100).reshape(-1, 1)\n",
    "X_test_norm = (X_test - np.mean(X_train)) / np.std(X_train)\n",
    "\n",
    "y_pred = model(tf.cast(X_test_norm, dtype=tf.float32))\n",
    "\n",
    "\n",
    "fig = plt.figure(figsize=(13, 5))\n",
    "ax = fig.add_subplot(1, 2, 1)\n",
    "plt.plot(X_train_norm, y_train, 'o', markersize=10)\n",
    "plt.plot(X_test_norm, y_pred, '--', lw=3)\n",
    "plt.legend(['Training examples', 'Linear Reg.'], fontsize=15)\n",
    "ax.set_xlabel('x', size=15)\n",
    "ax.set_ylabel('y', size=15)\n",
    "ax.tick_params(axis='both', which='major', labelsize=15)\n",
    "\n",
    "ax = fig.add_subplot(1, 2, 2)\n",
    "plt.plot(Ws, lw=3)\n",
    "plt.plot(bs, lw=3)\n",
    "plt.legend(['Weight w', 'Bias unit b'], fontsize=15)\n",
    "ax.set_xlabel('Iteration', size=15)\n",
    "ax.set_ylabel('Value', size=15)\n",
    "ax.tick_params(axis='both', which='major', labelsize=15)\n",
    "#plt.savefig('ch13-linreg-1.pdf')\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Model training via the .compile() and .fit() methods"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "tf.random.set_seed(1)\n",
    "model = MyModel()\n",
    "#model.build((None, 1))\n",
    "\n",
    "model.compile(optimizer='sgd', \n",
    "              loss=loss_fn,\n",
    "              metrics=['mae', 'mse'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 10 samples\n",
      "Epoch 1/200\n",
      "10/10 [==============================] - 0s 33ms/sample - loss: 27.8562 - mae: 4.5967 - mse: 27.8562\n",
      "Epoch 2/200\n",
      "10/10 [==============================] - 0s 1ms/sample - loss: 18.6235 - mae: 3.7249 - mse: 18.6235\n",
      "Epoch 3/200\n",
      "10/10 [==============================] - 0s 904us/sample - loss: 12.5081 - mae: 3.0572 - mse: 12.5081\n",
      "Epoch 4/200\n",
      "10/10 [==============================] - 0s 941us/sample - loss: 8.4484 - mae: 2.4816 - mse: 8.4484\n",
      "Epoch 5/200\n",
      "10/10 [==============================] - 0s 899us/sample - loss: 5.7520 - mae: 2.0644 - mse: 5.7520\n",
      "Epoch 6/200\n",
      "10/10 [==============================] - 0s 913us/sample - loss: 3.9580 - mae: 1.7283 - mse: 3.9580\n",
      "Epoch 7/200\n",
      "10/10 [==============================] - 0s 902us/sample - loss: 2.7617 - mae: 1.4792 - mse: 2.7617\n",
      "Epoch 8/200\n",
      "10/10 [==============================] - 0s 956us/sample - loss: 1.9714 - mae: 1.2577 - mse: 1.9714\n",
      "Epoch 9/200\n",
      "10/10 [==============================] - 0s 956us/sample - loss: 1.4485 - mae: 1.0911 - mse: 1.4485\n",
      "Epoch 10/200\n",
      "10/10 [==============================] - 0s 938us/sample - loss: 1.1002 - mae: 0.9636 - mse: 1.1002\n",
      "Epoch 11/200\n",
      "10/10 [==============================] - 0s 938us/sample - loss: 0.8714 - mae: 0.8620 - mse: 0.8714\n",
      "Epoch 12/200\n",
      "10/10 [==============================] - 0s 1ms/sample - loss: 0.7190 - mae: 0.7764 - mse: 0.7190\n",
      "Epoch 13/200\n",
      "10/10 [==============================] - 0s 991us/sample - loss: 0.6173 - mae: 0.7089 - mse: 0.6173\n",
      "Epoch 14/200\n",
      "10/10 [==============================] - 0s 938us/sample - loss: 0.5492 - mae: 0.6419 - mse: 0.5492\n",
      "Epoch 15/200\n",
      "10/10 [==============================] - 0s 971us/sample - loss: 0.5042 - mae: 0.6007 - mse: 0.5042\n",
      "Epoch 16/200\n",
      "10/10 [==============================] - 0s 966us/sample - loss: 0.4740 - mae: 0.5553 - mse: 0.4740\n",
      "Epoch 17/200\n",
      "10/10 [==============================] - 0s 962us/sample - loss: 0.4546 - mae: 0.5334 - mse: 0.4546\n",
      "Epoch 18/200\n",
      "10/10 [==============================] - 0s 983us/sample - loss: 0.4402 - mae: 0.5155 - mse: 0.4402\n",
      "Epoch 19/200\n",
      "10/10 [==============================] - 0s 931us/sample - loss: 0.4310 - mae: 0.5022 - mse: 0.4310\n",
      "Epoch 20/200\n",
      "10/10 [==============================] - 0s 915us/sample - loss: 0.4248 - mae: 0.5025 - mse: 0.4248\n",
      "Epoch 21/200\n",
      "10/10 [==============================] - 0s 944us/sample - loss: 0.4211 - mae: 0.4927 - mse: 0.4211\n",
      "Epoch 22/200\n",
      "10/10 [==============================] - 0s 1ms/sample - loss: 0.4175 - mae: 0.5016 - mse: 0.4175\n",
      "Epoch 23/200\n",
      "10/10 [==============================] - 0s 956us/sample - loss: 0.4166 - mae: 0.4911 - mse: 0.4166\n",
      "Epoch 24/200\n",
      "10/10 [==============================] - 0s 980us/sample - loss: 0.4155 - mae: 0.4918 - mse: 0.4155\n",
      "Epoch 25/200\n",
      "10/10 [==============================] - 0s 971us/sample - loss: 0.4147 - mae: 0.4931 - mse: 0.4147\n",
      "Epoch 26/200\n",
      "10/10 [==============================] - 0s 941us/sample - loss: 0.4144 - mae: 0.4922 - mse: 0.4144\n",
      "Epoch 27/200\n",
      "10/10 [==============================] - 0s 890us/sample - loss: 0.4141 - mae: 0.4902 - mse: 0.4141\n",
      "Epoch 28/200\n",
      "10/10 [==============================] - 0s 887us/sample - loss: 0.4141 - mae: 0.4900 - mse: 0.4141\n",
      "Epoch 29/200\n",
      "10/10 [==============================] - 0s 987us/sample - loss: 0.4139 - mae: 0.4923 - mse: 0.4139\n",
      "Epoch 30/200\n",
      "10/10 [==============================] - 0s 1ms/sample - loss: 0.4138 - mae: 0.4917 - mse: 0.4138\n",
      "Epoch 31/200\n",
      "10/10 [==============================] - 0s 1ms/sample - loss: 0.4137 - mae: 0.4893 - mse: 0.4137\n",
      "Epoch 32/200\n",
      "10/10 [==============================] - 0s 1ms/sample - loss: 0.4139 - mae: 0.4854 - mse: 0.4139\n",
      "Epoch 33/200\n",
      "10/10 [==============================] - 0s 1ms/sample - loss: 0.4139 - mae: 0.4882 - mse: 0.4139\n",
      "Epoch 34/200\n",
      "10/10 [==============================] - 0s 1ms/sample - loss: 0.4139 - mae: 0.4898 - mse: 0.4139\n",
      "Epoch 35/200\n",
      "10/10 [==============================] - 0s 1ms/sample - loss: 0.4137 - mae: 0.4816 - mse: 0.4137\n",
      "Epoch 36/200\n",
      "10/10 [==============================] - 0s 993us/sample - loss: 0.4137 - mae: 0.4933 - mse: 0.4137\n",
      "Epoch 37/200\n",
      "10/10 [==============================] - 0s 1ms/sample - loss: 0.4137 - mae: 0.4883 - mse: 0.4137\n",
      "Epoch 38/200\n",
      "10/10 [==============================] - 0s 975us/sample - loss: 0.4132 - mae: 0.4801 - mse: 0.4132\n",
      "Epoch 39/200\n",
      "10/10 [==============================] - 0s 972us/sample - loss: 0.4137 - mae: 0.4855 - mse: 0.4137\n",
      "Epoch 40/200\n",
      "10/10 [==============================] - 0s 979us/sample - loss: 0.4135 - mae: 0.4975 - mse: 0.4135\n",
      "Epoch 41/200\n",
      "10/10 [==============================] - 0s 879us/sample - loss: 0.4137 - mae: 0.4905 - mse: 0.4137\n",
      "Epoch 42/200\n",
      "10/10 [==============================] - 0s 1ms/sample - loss: 0.4138 - mae: 0.4851 - mse: 0.4138\n",
      "Epoch 43/200\n",
      "10/10 [==============================] - 0s 976us/sample - loss: 0.4132 - mae: 0.4889 - mse: 0.4132\n",
      "Epoch 44/200\n",
      "10/10 [==============================] - 0s 1ms/sample - loss: 0.4137 - mae: 0.4928 - mse: 0.4137\n",
      "Epoch 45/200\n",
      "10/10 [==============================] - 0s 1ms/sample - loss: 0.4136 - mae: 0.4864 - mse: 0.4136\n",
      "Epoch 46/200\n",
      "10/10 [==============================] - 0s 963us/sample - loss: 0.4140 - mae: 0.4923 - mse: 0.4140\n",
      "Epoch 47/200\n",
      "10/10 [==============================] - 0s 996us/sample - loss: 0.4138 - mae: 0.4837 - mse: 0.4138\n",
      "Epoch 48/200\n",
      "10/10 [==============================] - 0s 927us/sample - loss: 0.4138 - mae: 0.4909 - mse: 0.4138\n",
      "Epoch 49/200\n",
      "10/10 [==============================] - 0s 978us/sample - loss: 0.4137 - mae: 0.4855 - mse: 0.4137\n",
      "Epoch 50/200\n",
      "10/10 [==============================] - 0s 985us/sample - loss: 0.4138 - mae: 0.4883 - mse: 0.4138\n",
      "Epoch 51/200\n",
      "10/10 [==============================] - 0s 966us/sample - loss: 0.4139 - mae: 0.4890 - mse: 0.4139\n",
      "Epoch 52/200\n",
      "10/10 [==============================] - 0s 1ms/sample - loss: 0.4138 - mae: 0.4979 - mse: 0.4138\n",
      "Epoch 53/200\n",
      "10/10 [==============================] - 0s 1ms/sample - loss: 0.4136 - mae: 0.4861 - mse: 0.4136\n",
      "Epoch 54/200\n",
      "10/10 [==============================] - 0s 1ms/sample - loss: 0.4132 - mae: 0.4830 - mse: 0.4132\n",
      "Epoch 55/200\n",
      "10/10 [==============================] - 0s 1ms/sample - loss: 0.4130 - mae: 0.4840 - mse: 0.4130\n",
      "Epoch 56/200\n",
      "10/10 [==============================] - 0s 1ms/sample - loss: 0.4135 - mae: 0.4892 - mse: 0.4135\n",
      "Epoch 57/200\n",
      "10/10 [==============================] - 0s 978us/sample - loss: 0.4133 - mae: 0.4945 - mse: 0.4133\n",
      "Epoch 58/200\n",
      "10/10 [==============================] - 0s 1ms/sample - loss: 0.4131 - mae: 0.4946 - mse: 0.4131\n",
      "Epoch 59/200\n",
      "10/10 [==============================] - 0s 976us/sample - loss: 0.4135 - mae: 0.4834 - mse: 0.4135\n",
      "Epoch 60/200\n",
      "10/10 [==============================] - 0s 941us/sample - loss: 0.4139 - mae: 0.4922 - mse: 0.4139\n",
      "Epoch 61/200\n",
      "10/10 [==============================] - 0s 963us/sample - loss: 0.4138 - mae: 0.4860 - mse: 0.4138\n",
      "Epoch 62/200\n",
      "10/10 [==============================] - 0s 960us/sample - loss: 0.4134 - mae: 0.4980 - mse: 0.4134\n",
      "Epoch 63/200\n",
      "10/10 [==============================] - 0s 1ms/sample - loss: 0.4137 - mae: 0.4926 - mse: 0.4137\n",
      "Epoch 64/200\n",
      "10/10 [==============================] - 0s 994us/sample - loss: 0.4140 - mae: 0.4892 - mse: 0.4140\n",
      "Epoch 65/200\n",
      "10/10 [==============================] - 0s 940us/sample - loss: 0.4129 - mae: 0.4811 - mse: 0.4129\n",
      "Epoch 66/200\n",
      "10/10 [==============================] - 0s 965us/sample - loss: 0.4138 - mae: 0.4914 - mse: 0.4138\n",
      "Epoch 67/200\n",
      "10/10 [==============================] - 0s 891us/sample - loss: 0.4137 - mae: 0.4957 - mse: 0.4137\n",
      "Epoch 68/200\n",
      "10/10 [==============================] - 0s 1ms/sample - loss: 0.4138 - mae: 0.4915 - mse: 0.4138\n",
      "Epoch 69/200\n",
      "10/10 [==============================] - 0s 971us/sample - loss: 0.4129 - mae: 0.4910 - mse: 0.4129\n",
      "Epoch 70/200\n",
      "10/10 [==============================] - 0s 974us/sample - loss: 0.4138 - mae: 0.4919 - mse: 0.4138\n",
      "Epoch 71/200\n",
      "10/10 [==============================] - 0s 987us/sample - loss: 0.4137 - mae: 0.4926 - mse: 0.4137\n",
      "Epoch 72/200\n",
      "10/10 [==============================] - 0s 997us/sample - loss: 0.4138 - mae: 0.4884 - mse: 0.4138\n",
      "Epoch 73/200\n",
      "10/10 [==============================] - 0s 1ms/sample - loss: 0.4141 - mae: 0.4875 - mse: 0.4141\n",
      "Epoch 74/200\n",
      "10/10 [==============================] - 0s 1ms/sample - loss: 0.4136 - mae: 0.4875 - mse: 0.4136\n",
      "Epoch 75/200\n",
      "10/10 [==============================] - 0s 995us/sample - loss: 0.4136 - mae: 0.4810 - mse: 0.4136\n",
      "Epoch 76/200\n",
      "10/10 [==============================] - 0s 991us/sample - loss: 0.4140 - mae: 0.4874 - mse: 0.4140\n",
      "Epoch 77/200\n",
      "10/10 [==============================] - 0s 967us/sample - loss: 0.4140 - mae: 0.4874 - mse: 0.4140\n",
      "Epoch 78/200\n",
      "10/10 [==============================] - 0s 1ms/sample - loss: 0.4135 - mae: 0.4810 - mse: 0.4135\n",
      "Epoch 79/200\n",
      "10/10 [==============================] - 0s 978us/sample - loss: 0.4137 - mae: 0.4840 - mse: 0.4137\n",
      "Epoch 80/200\n",
      "10/10 [==============================] - 0s 1ms/sample - loss: 0.4138 - mae: 0.4855 - mse: 0.4138\n",
      "Epoch 81/200\n",
      "10/10 [==============================] - 0s 981us/sample - loss: 0.4132 - mae: 0.4876 - mse: 0.4132\n",
      "Epoch 82/200\n",
      "10/10 [==============================] - 0s 983us/sample - loss: 0.4138 - mae: 0.4899 - mse: 0.4138\n",
      "Epoch 83/200\n",
      "10/10 [==============================] - 0s 1ms/sample - loss: 0.4136 - mae: 0.4850 - mse: 0.4136\n",
      "Epoch 84/200\n",
      "10/10 [==============================] - 0s 1ms/sample - loss: 0.4137 - mae: 0.4958 - mse: 0.4137\n",
      "Epoch 85/200\n",
      "10/10 [==============================] - 0s 1ms/sample - loss: 0.4138 - mae: 0.4924 - mse: 0.4138\n",
      "Epoch 86/200\n",
      "10/10 [==============================] - 0s 986us/sample - loss: 0.4135 - mae: 0.4956 - mse: 0.4135\n",
      "Epoch 87/200\n",
      "10/10 [==============================] - 0s 980us/sample - loss: 0.4132 - mae: 0.4832 - mse: 0.4132\n",
      "Epoch 88/200\n",
      "10/10 [==============================] - 0s 960us/sample - loss: 0.4139 - mae: 0.4920 - mse: 0.4139\n",
      "Epoch 89/200\n",
      "10/10 [==============================] - 0s 924us/sample - loss: 0.4136 - mae: 0.4900 - mse: 0.4136\n",
      "Epoch 90/200\n",
      "10/10 [==============================] - 0s 922us/sample - loss: 0.4139 - mae: 0.4911 - mse: 0.4139\n",
      "Epoch 91/200\n",
      "10/10 [==============================] - 0s 916us/sample - loss: 0.4137 - mae: 0.4846 - mse: 0.4137\n",
      "Epoch 92/200\n",
      "10/10 [==============================] - 0s 945us/sample - loss: 0.4140 - mae: 0.4901 - mse: 0.4140\n",
      "Epoch 93/200\n",
      "10/10 [==============================] - 0s 897us/sample - loss: 0.4137 - mae: 0.4845 - mse: 0.4137\n",
      "Epoch 94/200\n",
      "10/10 [==============================] - 0s 970us/sample - loss: 0.4134 - mae: 0.4819 - mse: 0.4134\n",
      "Epoch 95/200\n",
      "10/10 [==============================] - 0s 919us/sample - loss: 0.4139 - mae: 0.4921 - mse: 0.4139\n",
      "Epoch 96/200\n",
      "10/10 [==============================] - 0s 963us/sample - loss: 0.4139 - mae: 0.4903 - mse: 0.4139\n",
      "Epoch 97/200\n",
      "10/10 [==============================] - 0s 964us/sample - loss: 0.4135 - mae: 0.4885 - mse: 0.4135\n",
      "Epoch 98/200\n",
      "10/10 [==============================] - 0s 984us/sample - loss: 0.4137 - mae: 0.4818 - mse: 0.4137\n",
      "Epoch 99/200\n",
      "10/10 [==============================] - 0s 940us/sample - loss: 0.4138 - mae: 0.4875 - mse: 0.4138\n",
      "Epoch 100/200\n",
      "10/10 [==============================] - 0s 944us/sample - loss: 0.4137 - mae: 0.4857 - mse: 0.4137\n",
      "Epoch 101/200\n",
      "10/10 [==============================] - 0s 930us/sample - loss: 0.4139 - mae: 0.4911 - mse: 0.4139\n",
      "Epoch 102/200\n",
      "10/10 [==============================] - 0s 965us/sample - loss: 0.4139 - mae: 0.4904 - mse: 0.4139\n",
      "Epoch 103/200\n",
      "10/10 [==============================] - 0s 949us/sample - loss: 0.4138 - mae: 0.4911 - mse: 0.4138\n",
      "Epoch 104/200\n",
      "10/10 [==============================] - 0s 961us/sample - loss: 0.4140 - mae: 0.4912 - mse: 0.4140\n",
      "Epoch 105/200\n",
      "10/10 [==============================] - 0s 919us/sample - loss: 0.4139 - mae: 0.4946 - mse: 0.4139\n",
      "Epoch 106/200\n",
      "10/10 [==============================] - 0s 921us/sample - loss: 0.4139 - mae: 0.4861 - mse: 0.4139\n",
      "Epoch 107/200\n",
      "10/10 [==============================] - 0s 963us/sample - loss: 0.4135 - mae: 0.4843 - mse: 0.4135\n",
      "Epoch 108/200\n",
      "10/10 [==============================] - 0s 973us/sample - loss: 0.4136 - mae: 0.4863 - mse: 0.4136\n",
      "Epoch 109/200\n",
      "10/10 [==============================] - 0s 1ms/sample - loss: 0.4139 - mae: 0.4938 - mse: 0.4139\n",
      "Epoch 110/200\n",
      "10/10 [==============================] - 0s 971us/sample - loss: 0.4134 - mae: 0.4853 - mse: 0.4134\n",
      "Epoch 111/200\n",
      "10/10 [==============================] - 0s 980us/sample - loss: 0.4138 - mae: 0.4918 - mse: 0.4138\n",
      "Epoch 112/200\n",
      "10/10 [==============================] - 0s 959us/sample - loss: 0.4139 - mae: 0.4904 - mse: 0.4139\n",
      "Epoch 113/200\n",
      "10/10 [==============================] - 0s 982us/sample - loss: 0.4135 - mae: 0.4854 - mse: 0.4135\n",
      "Epoch 114/200\n",
      "10/10 [==============================] - 0s 950us/sample - loss: 0.4139 - mae: 0.4937 - mse: 0.4139\n",
      "Epoch 115/200\n",
      "10/10 [==============================] - 0s 991us/sample - loss: 0.4140 - mae: 0.4901 - mse: 0.4140\n",
      "Epoch 116/200\n",
      "10/10 [==============================] - 0s 1ms/sample - loss: 0.4138 - mae: 0.4897 - mse: 0.4138\n",
      "Epoch 117/200\n",
      "10/10 [==============================] - 0s 1ms/sample - loss: 0.4139 - mae: 0.4881 - mse: 0.4139\n",
      "Epoch 118/200\n",
      "10/10 [==============================] - 0s 947us/sample - loss: 0.4140 - mae: 0.4906 - mse: 0.4140\n",
      "Epoch 119/200\n",
      "10/10 [==============================] - 0s 934us/sample - loss: 0.4139 - mae: 0.4877 - mse: 0.4139\n",
      "Epoch 120/200\n",
      "10/10 [==============================] - 0s 933us/sample - loss: 0.4136 - mae: 0.4859 - mse: 0.4136\n",
      "Epoch 121/200\n",
      "10/10 [==============================] - 0s 935us/sample - loss: 0.4136 - mae: 0.4972 - mse: 0.4136\n",
      "Epoch 122/200\n",
      "10/10 [==============================] - 0s 1ms/sample - loss: 0.4139 - mae: 0.4900 - mse: 0.4139\n",
      "Epoch 123/200\n",
      "10/10 [==============================] - 0s 1ms/sample - loss: 0.4132 - mae: 0.4932 - mse: 0.4132\n",
      "Epoch 124/200\n",
      "10/10 [==============================] - 0s 1ms/sample - loss: 0.4135 - mae: 0.4805 - mse: 0.4135\n",
      "Epoch 125/200\n",
      "10/10 [==============================] - 0s 992us/sample - loss: 0.4132 - mae: 0.4915 - mse: 0.4132\n",
      "Epoch 126/200\n",
      "10/10 [==============================] - 0s 1ms/sample - loss: 0.4139 - mae: 0.4916 - mse: 0.4139\n",
      "Epoch 127/200\n",
      "10/10 [==============================] - 0s 959us/sample - loss: 0.4138 - mae: 0.4923 - mse: 0.4138\n",
      "Epoch 128/200\n",
      "10/10 [==============================] - 0s 965us/sample - loss: 0.4138 - mae: 0.4930 - mse: 0.4138\n",
      "Epoch 129/200\n",
      "10/10 [==============================] - 0s 974us/sample - loss: 0.4139 - mae: 0.4863 - mse: 0.4139\n",
      "Epoch 130/200\n",
      "10/10 [==============================] - 0s 949us/sample - loss: 0.4140 - mae: 0.4908 - mse: 0.4140\n",
      "Epoch 131/200\n",
      "10/10 [==============================] - 0s 1ms/sample - loss: 0.4138 - mae: 0.4875 - mse: 0.4138\n",
      "Epoch 132/200\n",
      "10/10 [==============================] - 0s 1ms/sample - loss: 0.4131 - mae: 0.4763 - mse: 0.4131\n",
      "Epoch 133/200\n",
      "10/10 [==============================] - 0s 972us/sample - loss: 0.4139 - mae: 0.4887 - mse: 0.4139\n",
      "Epoch 134/200\n",
      "10/10 [==============================] - 0s 1ms/sample - loss: 0.4131 - mae: 0.4830 - mse: 0.4131\n",
      "Epoch 135/200\n",
      "10/10 [==============================] - 0s 1ms/sample - loss: 0.4137 - mae: 0.4861 - mse: 0.4137\n",
      "Epoch 136/200\n",
      "10/10 [==============================] - 0s 920us/sample - loss: 0.4135 - mae: 0.4861 - mse: 0.4135\n",
      "Epoch 137/200\n",
      "10/10 [==============================] - 0s 944us/sample - loss: 0.4137 - mae: 0.4842 - mse: 0.4137\n",
      "Epoch 138/200\n",
      "10/10 [==============================] - 0s 923us/sample - loss: 0.4141 - mae: 0.4924 - mse: 0.4141\n",
      "Epoch 139/200\n",
      "10/10 [==============================] - 0s 961us/sample - loss: 0.4138 - mae: 0.4948 - mse: 0.4138\n",
      "Epoch 140/200\n",
      "10/10 [==============================] - 0s 962us/sample - loss: 0.4136 - mae: 0.4842 - mse: 0.4136\n",
      "Epoch 141/200\n",
      "10/10 [==============================] - 0s 940us/sample - loss: 0.4137 - mae: 0.4956 - mse: 0.4137\n",
      "Epoch 142/200\n",
      "10/10 [==============================] - 0s 1ms/sample - loss: 0.4137 - mae: 0.4872 - mse: 0.4137\n",
      "Epoch 143/200\n",
      "10/10 [==============================] - 0s 1ms/sample - loss: 0.4139 - mae: 0.4895 - mse: 0.4139\n",
      "Epoch 144/200\n",
      "10/10 [==============================] - 0s 1ms/sample - loss: 0.4136 - mae: 0.4865 - mse: 0.4136\n",
      "Epoch 145/200\n",
      "10/10 [==============================] - 0s 955us/sample - loss: 0.4137 - mae: 0.4940 - mse: 0.4137\n",
      "Epoch 146/200\n",
      "10/10 [==============================] - 0s 881us/sample - loss: 0.4139 - mae: 0.4884 - mse: 0.4139\n",
      "Epoch 147/200\n",
      "10/10 [==============================] - 0s 918us/sample - loss: 0.4130 - mae: 0.4828 - mse: 0.4130\n",
      "Epoch 148/200\n",
      "10/10 [==============================] - 0s 902us/sample - loss: 0.4140 - mae: 0.4875 - mse: 0.4140\n",
      "Epoch 149/200\n",
      "10/10 [==============================] - 0s 936us/sample - loss: 0.4133 - mae: 0.4924 - mse: 0.4133\n",
      "Epoch 150/200\n",
      "10/10 [==============================] - 0s 920us/sample - loss: 0.4137 - mae: 0.4875 - mse: 0.4137\n",
      "Epoch 151/200\n",
      "10/10 [==============================] - 0s 888us/sample - loss: 0.4138 - mae: 0.4866 - mse: 0.4138\n",
      "Epoch 152/200\n",
      "10/10 [==============================] - 0s 930us/sample - loss: 0.4133 - mae: 0.4924 - mse: 0.4133\n",
      "Epoch 153/200\n",
      "10/10 [==============================] - 0s 884us/sample - loss: 0.4140 - mae: 0.4889 - mse: 0.4140\n",
      "Epoch 154/200\n",
      "10/10 [==============================] - 0s 957us/sample - loss: 0.4140 - mae: 0.4895 - mse: 0.4140\n",
      "Epoch 155/200\n",
      "10/10 [==============================] - 0s 970us/sample - loss: 0.4138 - mae: 0.4835 - mse: 0.4138\n",
      "Epoch 156/200\n",
      "10/10 [==============================] - 0s 957us/sample - loss: 0.4139 - mae: 0.4862 - mse: 0.4139\n",
      "Epoch 157/200\n",
      "10/10 [==============================] - 0s 997us/sample - loss: 0.4138 - mae: 0.4868 - mse: 0.4138\n",
      "Epoch 158/200\n",
      "10/10 [==============================] - 0s 933us/sample - loss: 0.4138 - mae: 0.4910 - mse: 0.4138\n",
      "Epoch 159/200\n",
      "10/10 [==============================] - 0s 993us/sample - loss: 0.4138 - mae: 0.4858 - mse: 0.4138\n",
      "Epoch 160/200\n",
      "10/10 [==============================] - 0s 951us/sample - loss: 0.4139 - mae: 0.4881 - mse: 0.4139\n",
      "Epoch 161/200\n",
      "10/10 [==============================] - 0s 977us/sample - loss: 0.4140 - mae: 0.4895 - mse: 0.4140\n",
      "Epoch 162/200\n",
      "10/10 [==============================] - 0s 894us/sample - loss: 0.4131 - mae: 0.4949 - mse: 0.4131\n",
      "Epoch 163/200\n",
      "10/10 [==============================] - 0s 949us/sample - loss: 0.4138 - mae: 0.4830 - mse: 0.4138\n",
      "Epoch 164/200\n",
      "10/10 [==============================] - 0s 938us/sample - loss: 0.4135 - mae: 0.4943 - mse: 0.4135\n",
      "Epoch 165/200\n",
      "10/10 [==============================] - 0s 904us/sample - loss: 0.4138 - mae: 0.4824 - mse: 0.4138\n",
      "Epoch 166/200\n",
      "10/10 [==============================] - 0s 973us/sample - loss: 0.4140 - mae: 0.4889 - mse: 0.4140\n",
      "Epoch 167/200\n",
      "10/10 [==============================] - 0s 1ms/sample - loss: 0.4134 - mae: 0.4799 - mse: 0.4134\n",
      "Epoch 168/200\n",
      "10/10 [==============================] - 0s 941us/sample - loss: 0.4137 - mae: 0.4864 - mse: 0.4137\n",
      "Epoch 169/200\n",
      "10/10 [==============================] - 0s 976us/sample - loss: 0.4134 - mae: 0.4937 - mse: 0.4134\n",
      "Epoch 170/200\n",
      "10/10 [==============================] - 0s 964us/sample - loss: 0.4140 - mae: 0.4894 - mse: 0.4140\n",
      "Epoch 171/200\n",
      "10/10 [==============================] - 0s 947us/sample - loss: 0.4137 - mae: 0.4887 - mse: 0.4137\n",
      "Epoch 172/200\n",
      "10/10 [==============================] - 0s 955us/sample - loss: 0.4139 - mae: 0.4906 - mse: 0.4139\n",
      "Epoch 173/200\n",
      "10/10 [==============================] - 0s 907us/sample - loss: 0.4135 - mae: 0.4860 - mse: 0.4135\n",
      "Epoch 174/200\n",
      "10/10 [==============================] - 0s 962us/sample - loss: 0.4135 - mae: 0.4947 - mse: 0.4135\n",
      "Epoch 175/200\n",
      "10/10 [==============================] - 0s 885us/sample - loss: 0.4139 - mae: 0.4869 - mse: 0.4139\n",
      "Epoch 176/200\n",
      "10/10 [==============================] - 0s 940us/sample - loss: 0.4135 - mae: 0.4864 - mse: 0.4135\n",
      "Epoch 177/200\n",
      "10/10 [==============================] - 0s 976us/sample - loss: 0.4138 - mae: 0.4841 - mse: 0.4138\n",
      "Epoch 178/200\n",
      "10/10 [==============================] - 0s 928us/sample - loss: 0.4133 - mae: 0.4857 - mse: 0.4133\n",
      "Epoch 179/200\n",
      "10/10 [==============================] - 0s 1ms/sample - loss: 0.4140 - mae: 0.4915 - mse: 0.4140\n",
      "Epoch 180/200\n",
      "10/10 [==============================] - 0s 947us/sample - loss: 0.4139 - mae: 0.4901 - mse: 0.4139\n",
      "Epoch 181/200\n",
      "10/10 [==============================] - 0s 934us/sample - loss: 0.4137 - mae: 0.4932 - mse: 0.4137\n",
      "Epoch 182/200\n",
      "10/10 [==============================] - 0s 951us/sample - loss: 0.4138 - mae: 0.4887 - mse: 0.4138\n",
      "Epoch 183/200\n",
      "10/10 [==============================] - 0s 914us/sample - loss: 0.4137 - mae: 0.4905 - mse: 0.4137\n",
      "Epoch 184/200\n",
      "10/10 [==============================] - 0s 1ms/sample - loss: 0.4138 - mae: 0.4861 - mse: 0.4138\n",
      "Epoch 185/200\n",
      "10/10 [==============================] - 0s 1ms/sample - loss: 0.4136 - mae: 0.4954 - mse: 0.4136\n",
      "Epoch 186/200\n",
      "10/10 [==============================] - 0s 909us/sample - loss: 0.4139 - mae: 0.4933 - mse: 0.4139\n",
      "Epoch 187/200\n",
      "10/10 [==============================] - 0s 1ms/sample - loss: 0.4139 - mae: 0.4905 - mse: 0.4139\n",
      "Epoch 188/200\n",
      "10/10 [==============================] - 0s 937us/sample - loss: 0.4135 - mae: 0.4797 - mse: 0.4135\n",
      "Epoch 189/200\n",
      "10/10 [==============================] - 0s 947us/sample - loss: 0.4140 - mae: 0.4899 - mse: 0.4140\n",
      "Epoch 190/200\n",
      "10/10 [==============================] - 0s 936us/sample - loss: 0.4138 - mae: 0.4942 - mse: 0.4138\n",
      "Epoch 191/200\n",
      "10/10 [==============================] - 0s 863us/sample - loss: 0.4139 - mae: 0.4856 - mse: 0.4139\n",
      "Epoch 192/200\n",
      "10/10 [==============================] - 0s 989us/sample - loss: 0.4137 - mae: 0.4908 - mse: 0.4137\n",
      "Epoch 193/200\n",
      "10/10 [==============================] - 0s 913us/sample - loss: 0.4139 - mae: 0.4914 - mse: 0.4139\n",
      "Epoch 194/200\n",
      "10/10 [==============================] - 0s 919us/sample - loss: 0.4139 - mae: 0.4909 - mse: 0.4139\n",
      "Epoch 195/200\n",
      "10/10 [==============================] - 0s 932us/sample - loss: 0.4139 - mae: 0.4894 - mse: 0.4139\n",
      "Epoch 196/200\n",
      "10/10 [==============================] - 0s 876us/sample - loss: 0.4135 - mae: 0.4965 - mse: 0.4135\n",
      "Epoch 197/200\n",
      "10/10 [==============================] - 0s 989us/sample - loss: 0.4138 - mae: 0.4930 - mse: 0.4138\n",
      "Epoch 198/200\n",
      "10/10 [==============================] - 0s 905us/sample - loss: 0.4136 - mae: 0.4804 - mse: 0.4136\n",
      "Epoch 199/200\n",
      "10/10 [==============================] - 0s 1ms/sample - loss: 0.4137 - mae: 0.4902 - mse: 0.4137\n",
      "Epoch 200/200\n",
      "10/10 [==============================] - 0s 999us/sample - loss: 0.4139 - mae: 0.4925 - mse: 0.4139\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<tensorflow.python.keras.callbacks.History at 0x7f8f9bf78c88>"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.fit(X_train_norm, y_train, \n",
    "          epochs=num_epochs, batch_size=batch_size,\n",
    "          verbose=1)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2.7058775 4.971019\n"
     ]
    },
    {
     "data": {
      "image/png": "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pUtMnz6d6dOn53v+5MmTgFZO4+npybx583j22WepUaMGkydP5sknZZGfCuPEDlj2D8g+7+ir2x08HLPMjIqtzardyVhs1kIP46HXMTI2pjQjFeWQ0WikefPmxMXFkZSURFJSEu3btwe0AZY333wTm81GXFwcnTp1cnG0olLIOg/H47QVSP/+EZL3QMapGzuGoofIlpCZAg36Qo022pSKATVlNL0MuUemewPK24jYtTXuq1atombNmixZssTed/XNqa4QERHBTz/9lK//3LlzBd60WhRFUXj22WeZM2cOf/75Jz179uTLL7+kc+fO9ptUAS5evHjLcV8rJSWFmJgYp3a1atUK3Fav1+Pv78/w4cOdSmWuuPIHgdFoZObMmcycOZNDhw7x3nvvMWbMGBo2bHjLawEIN7Dnc20OeNvlpeh1HtD3LWj5iNNm0cG+zB/aMt+sWKB933jodcwf2lKmlywDN1LK4i46dOjAF198QVxcHLVq1bJ/L7Vt25aMjAx++uknjhw5wgsvvODiSEWFY7PBqT3aVIpHN8NvX2jJ+42KagMBNbQBjqqRUL0leOW/B06UrXKXxJf3ETGTyWQfCb/i6oTeFe644w5mz57N3r177SU1iYmJ7Nu3r8gkPjc3l9zcXPz9/Z36Dx8+DDiuQphMpnxTppXGe169ejUTJ04EtJH2tWvX0rlz50K379atG/v376d169bFOn79+vV5++23mT9/PgcOHJAkvjyzWmDjy7BjvqPPGAIPfw7RBdckd6kfxrfjY/no50RWJySTlWfB19PAwBaRjIyNkQReFKpjx468++67fPrpp/ZReAA/Pz8aN27M3LlzAamHFyXAZoNzf8JPs+HAGvD0g7yMGztGzfZwWw9tUaNaHbW504VbKndJfHkfEevevTvvv/8+zz33HL169WLr1q0sW7bMpTENHDiQBg0acN999zFz5kwMBgPTpk0jIiICna7wWUjPnTtH8+bNGT58OJ07d8bf358DBw4wa9YsoqOj6devH6C95+eee445c+bQokUL1q5da5/9pSTNnz8fnU5H/fr1WbBgAUlJSTz//POFbj9jxgzatWtH//79GT58OEFBQSQlJfHdd9/x5JNP0qFDB/r06UPHjh1p3rw5Xl5eLFu2DL1eT2xsbInHL8qI6RKsHKFdRr4ivAkMXqpdCi5CdLAvMwY0cYub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\n",
      "text/plain": [
       "<Figure size 936x360 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "print(model.w.numpy(), model.b.numpy())\n",
    "\n",
    "\n",
    "X_test = np.linspace(0, 9, num=100).reshape(-1, 1)\n",
    "X_test_norm = (X_test - np.mean(X_train)) / np.std(X_train)\n",
    "\n",
    "y_pred = model(tf.cast(X_test_norm, dtype=tf.float32))\n",
    "\n",
    "\n",
    "fig = plt.figure(figsize=(13, 5))\n",
    "ax = fig.add_subplot(1, 2, 1)\n",
    "plt.plot(X_train_norm, y_train, 'o', markersize=10)\n",
    "plt.plot(X_test_norm, y_pred, '--', lw=3)\n",
    "plt.legend(['Training Samples', 'Linear Regression'], fontsize=15)\n",
    "\n",
    "ax = fig.add_subplot(1, 2, 2)\n",
    "plt.plot(Ws, lw=3)\n",
    "plt.plot(bs, lw=3)\n",
    "plt.legend(['W', 'bias'], fontsize=15)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Building a multilayer perceptron for classifying flowers in the Iris dataset"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "WARNING:absl:Warning: Setting shuffle_files=True because split=TRAIN and shuffle_files=None. This behavior will be deprecated on 2019-08-06, at which point shuffle_files=False will be the default for all splits.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tfds.core.DatasetInfo(\n",
      "    name='iris',\n",
      "    version=1.0.0,\n",
      "    description='This is perhaps the best known database to be found in the pattern recognition\n",
      "literature. Fisher's paper is a classic in the field and is referenced\n",
      "frequently to this day. (See Duda & Hart, for example.) The data set contains\n",
      "3 classes of 50 instances each, where each class refers to a type of iris\n",
      "plant. One class is linearly separable from the other 2; the latter are NOT\n",
      "linearly separable from each other.\n",
      "',\n",
      "    urls=['https://archive.ics.uci.edu/ml/datasets/iris'],\n",
      "    features=FeaturesDict({\n",
      "        'features': Tensor(shape=(4,), dtype=tf.float32),\n",
      "        'label': ClassLabel(shape=(), dtype=tf.int64, num_classes=3),\n",
      "    }),\n",
      "    total_num_examples=150,\n",
      "    splits={\n",
      "        'train': 150,\n",
      "    },\n",
      "    supervised_keys=('features', 'label'),\n",
      "    citation=\"\"\"@misc{Dua:2019 ,\n",
      "    author = \"Dua, Dheeru and Graff, Casey\",\n",
      "    year = \"2017\",\n",
      "    title = \"{UCI} Machine Learning Repository\",\n",
      "    url = \"http://archive.ics.uci.edu/ml\",\n",
      "    institution = \"University of California, Irvine, School of Information and Computer Sciences\"\n",
      "    }\"\"\",\n",
      "    redistribution_info=,\n",
      ")\n",
      "\n"
     ]
    }
   ],
   "source": [
    "import tensorflow_datasets as tfds\n",
    "\n",
    "\n",
    "\n",
    "iris, iris_info = tfds.load('iris', with_info=True)\n",
    "\n",
    "print(iris_info)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'features': <tf.Tensor: id=117451, shape=(4,), dtype=float32, numpy=array([5.5, 3.5, 1.3, 0.2], dtype=float32)>, 'label': <tf.Tensor: id=117452, shape=(), dtype=int64, numpy=0>}\n"
     ]
    }
   ],
   "source": [
    "tf.random.set_seed(1)\n",
    "\n",
    "ds_orig = iris['train']\n",
    "ds_orig = ds_orig.shuffle(150, reshuffle_each_iteration=False)\n",
    "\n",
    "print(next(iter(ds_orig)))\n",
    "\n",
    "ds_train_orig = ds_orig.take(100)\n",
    "ds_test = ds_orig.skip(100)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "100\n",
      "50\n"
     ]
    }
   ],
   "source": [
    "## checking the number of examples:\n",
    "\n",
    "n = 0\n",
    "for example in ds_train_orig:\n",
    "    n += 1\n",
    "print(n)\n",
    "\n",
    "\n",
    "n = 0\n",
    "for example in ds_test:\n",
    "    n += 1\n",
    "print(n)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(<tf.Tensor: id=117786, shape=(4,), dtype=float32, numpy=array([5.5, 3.5, 1.3, 0.2], dtype=float32)>,\n",
       " <tf.Tensor: id=117787, shape=(), dtype=int64, numpy=0>)"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ds_train_orig = ds_train_orig.map(\n",
    "    lambda x: (x['features'], x['label']))\n",
    "\n",
    "ds_test = ds_test.map(\n",
    "    lambda x: (x['features'], x['label']))\n",
    "\n",
    "next(iter(ds_train_orig))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"sequential\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "fc1 (Dense)                  (None, 16)                80        \n",
      "_________________________________________________________________\n",
      "fc2 (Dense)                  (None, 3)                 51        \n",
      "=================================================================\n",
      "Total params: 131\n",
      "Trainable params: 131\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "iris_model = tf.keras.Sequential([\n",
    "    tf.keras.layers.Dense(16, activation='sigmoid', \n",
    "                          name='fc1', input_shape=(4,)),\n",
    "    tf.keras.layers.Dense(3, name='fc2', activation='softmax')])\n",
    "\n",
    "iris_model.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "iris_model.compile(optimizer='adam',\n",
    "                   loss='sparse_categorical_crossentropy',\n",
    "                   metrics=['accuracy'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "num_epochs = 100\n",
    "training_size = 100\n",
    "batch_size = 2\n",
    "steps_per_epoch = np.ceil(training_size / batch_size)\n",
    "\n",
    "ds_train = ds_train_orig.shuffle(buffer_size=training_size)\n",
    "ds_train = ds_train.repeat()\n",
    "ds_train = ds_train.batch(batch_size=batch_size)\n",
    "ds_train = ds_train.prefetch(buffer_size=1000)\n",
    "\n",
    "\n",
    "history = iris_model.fit(ds_train, epochs=num_epochs,\n",
    "                         steps_per_epoch=steps_per_epoch, \n",
    "                         verbose=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 864x360 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "hist = history.history\n",
    "\n",
    "fig = plt.figure(figsize=(12, 5))\n",
    "ax = fig.add_subplot(1, 2, 1)\n",
    "ax.plot(hist['loss'], lw=3)\n",
    "ax.set_title('Training loss', size=15)\n",
    "ax.set_xlabel('Epoch', size=15)\n",
    "ax.tick_params(axis='both', which='major', labelsize=15)\n",
    "\n",
    "ax = fig.add_subplot(1, 2, 2)\n",
    "ax.plot(hist['accuracy'], lw=3)\n",
    "ax.set_title('Training accuracy', size=15)\n",
    "ax.set_xlabel('Epoch', size=15)\n",
    "ax.tick_params(axis='both', which='major', labelsize=15)\n",
    "plt.tight_layout()\n",
    "#plt.savefig('ch13-cls-learning-curve.pdf')\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Evaluating the trained model on the test dataset"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Test loss: 0.1461   Test Acc.: 1.0000\n"
     ]
    }
   ],
   "source": [
    "results = iris_model.evaluate(ds_test.batch(50), verbose=0)\n",
    "print('Test loss: {:.4f}   Test Acc.: {:.4f}'.format(*results))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Saving and reloading the trained model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "iris_model.save('iris-classifier.h5', \n",
    "                overwrite=True,\n",
    "                include_optimizer=True,\n",
    "                save_format='h5')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"sequential\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "fc1 (Dense)                  (None, 16)                80        \n",
      "_________________________________________________________________\n",
      "fc2 (Dense)                  (None, 3)                 51        \n",
      "=================================================================\n",
      "Total params: 131\n",
      "Trainable params: 131\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "iris_model_new = tf.keras.models.load_model('iris-classifier.h5')\n",
    "\n",
    "iris_model_new.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Test loss: 0.1491   Test Acc.: 1.0000\n"
     ]
    }
   ],
   "source": [
    "results = iris_model_new.evaluate(ds_test.batch(50), verbose=0)\n",
    "print('Test loss: {:.4f}   Test Acc.: {:.4f}'.format(*results))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training Set:  100 Test Set:  50\n"
     ]
    }
   ],
   "source": [
    "labels_train = []\n",
    "for i,item in enumerate(ds_train_orig):\n",
    "    labels_train.append(item[1].numpy())\n",
    "    \n",
    "labels_test = []\n",
    "for i,item in enumerate(ds_test):\n",
    "    labels_test.append(item[1].numpy())\n",
    "print('Training Set: ',len(labels_train), 'Test Set: ', len(labels_test))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'{\"class_name\": \"Sequential\", \"config\": {\"name\": \"sequential\", \"layers\": [{\"class_name\": \"Dense\", \"config\": {\"name\": \"fc1\", \"trainable\": true, \"batch_input_shape\": [null, 4], \"dtype\": \"float32\", \"units\": 16, \"activation\": \"sigmoid\", \"use_bias\": true, \"kernel_initializer\": {\"class_name\": \"GlorotUniform\", \"config\": {\"seed\": null}}, \"bias_initializer\": {\"class_name\": \"Zeros\", \"config\": {}}, \"kernel_regularizer\": null, \"bias_regularizer\": null, \"activity_regularizer\": null, \"kernel_constraint\": null, \"bias_constraint\": null}}, {\"class_name\": \"Dense\", \"config\": {\"name\": \"fc2\", \"trainable\": true, \"dtype\": \"float32\", \"units\": 3, \"activation\": \"softmax\", \"use_bias\": true, \"kernel_initializer\": {\"class_name\": \"GlorotUniform\", \"config\": {\"seed\": null}}, \"bias_initializer\": {\"class_name\": \"Zeros\", \"config\": {}}, \"kernel_regularizer\": null, \"bias_regularizer\": null, \"activity_regularizer\": null, \"kernel_constraint\": null, \"bias_constraint\": null}}]}, \"keras_version\": \"2.2.4-tf\", \"backend\": \"tensorflow\"}'"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "iris_model_new.to_json()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Choosing activation functions for multilayer neural networks\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Logistic function recap"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "P(y=1|x) = 0.888\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "\n",
    "X = np.array([1, 1.4, 2.5]) ## first value must be 1\n",
    "w = np.array([0.4, 0.3, 0.5])\n",
    "\n",
    "def net_input(X, w):\n",
    "    return np.dot(X, w)\n",
    "\n",
    "def logistic(z):\n",
    "    return 1.0 / (1.0 + np.exp(-z))\n",
    "\n",
    "def logistic_activation(X, w):\n",
    "    z = net_input(X, w)\n",
    "    return logistic(z)\n",
    "\n",
    "print('P(y=1|x) = %.3f' % logistic_activation(X, w)) "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Net Input: \n",
      " [1.78 0.76 1.65]\n",
      "Output Units:\n",
      " [0.85569687 0.68135373 0.83889105]\n"
     ]
    }
   ],
   "source": [
    "# W : array with shape = (n_output_units, n_hidden_units+1)\n",
    "# note that the first column are the bias units\n",
    "\n",
    "W = np.array([[1.1, 1.2, 0.8, 0.4],\n",
    "              [0.2, 0.4, 1.0, 0.2],\n",
    "              [0.6, 1.5, 1.2, 0.7]])\n",
    "\n",
    "# A : data array with shape = (n_hidden_units + 1, n_samples)\n",
    "# note that the first column of this array must be 1\n",
    "\n",
    "A = np.array([[1, 0.1, 0.4, 0.6]])\n",
    "Z = np.dot(W, A[0])\n",
    "y_probas = logistic(Z)\n",
    "print('Net Input: \\n', Z)\n",
    "\n",
    "print('Output Units:\\n', y_probas) "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Predicted class label: 0\n"
     ]
    }
   ],
   "source": [
    "y_class = np.argmax(Z, axis=0)\n",
    "print('Predicted class label: %d' % y_class) "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Estimating class probabilities in multiclass classification via the softmax function"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Probabilities:\n",
      " [0.44668973 0.16107406 0.39223621]\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "1.0"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "def softmax(z):\n",
    "    return np.exp(z) / np.sum(np.exp(z))\n",
    "\n",
    "y_probas = softmax(Z)\n",
    "print('Probabilities:\\n', y_probas)\n",
    "\n",
    "np.sum(y_probas)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<tf.Tensor: id=134679, shape=(1, 3), dtype=float64, numpy=array([[0.44668973, 0.16107406, 0.39223621]])>"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import tensorflow as tf\n",
    "\n",
    "Z_tensor = tf.expand_dims(Z, axis=0)\n",
    "tf.keras.activations.softmax(Z_tensor)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Broadening the output spectrum using a hyperbolic tangent"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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AF9venepPgado8I+JejjZbfTnnBK1bRt2zZCQkIICwvT/yN1MMaQn5/PkSNHGDSoeuclEVljjBl/4jatdgRljJlcf6uTygH6V4n7Abub+J718vISIicMOOXtA/28uW7saae8fZcgX64Y2euUt+8e7E/3oad+BOnr7YXObq7UyZWUlDBw4EAtTichIoSFhbF///4Gb+MR16AaKAUYJiKDRMQPiAQ+dHNOSikFoMWpARr7HXlEgRKR60UkB5gIfCQiK5zL+4rIxwDGmHLgHmAFkAG8bYzZ4K6clVJKtSyP6CRhjHkPeK+W5buBq6vEHwMft2JqSinl8fLz85k0aRJg97jz9vamR48eAHz//ff4+fk1+L2ioqK48cYb+cUvftEiuTaGRxQopZRSpy4sLMzVZfuRRx4hODi4Wpf3tkoLlFJKNbN/rfyJuM82N6jttAn9+ccNo6stm7N0HW9+f/yumpmThnH/FWecUi7XXnstu3fvpqSkhPvvv58777yT8vJyunfvzm9/+1s++eQTgoKC+OCDD+jZsycAq1at4p///Ce5ubk88cQTXH/99af02U3lEdeglFJKtYwlS5awZs0aUlJSePLJJzl40L5ZsaCggEsvvZS1a9cyceJEXnnlFdc2+/bt45tvvuH999+vdrNxa9MCpZRS7di//vUvxowZw8SJE8nJyWHr1q0ABAYGukbiGDduHNu3b3dt84tf/AIRYfTo0ezatcsdaQN6ik8ppZrd/Vecccqn5AD+ccPoGqf9TkViYiJffvklq1evJjAwkIsvvpiSkhKAah0nvL29KS8/Put01dF3Wmswh9roEZRSSrVTBQUFdOvWjcDAQDZs2OAaC6+t0AKllFLt1M9//nOKi4sZM2YMjz76KOefX+fwpR6p1cbic6emjMWnlFL1ycjIYMSIEe5Oo02o7buqayw+PYJSSinlkbRAKaWU8khaoJRSSnkkLVBKKaU8khYopZRSHkkLlFJKKY+kBUoppdqB4ODgJr/H7t27ufHGG+tcf+jQIRYuXNjg9k2lBUoppRQAffv25Z133qlz/YkFqr72TaVj8SmlVHN6pEsLvndBo5rv2LGDO+64g/3799OjRw9effVVBgwYwNatW5k+fToVFRWEh4fz5JNPUlhYyPbt27nmmmtIT09nw4YNREdHU1ZWRmVlJe+++y4PP/wwW7duZezYsVxxxRXMmDHD1b6iooI//vGPrFixAhHhN7/5Dffee2+Tflw9glJKqXbqnnvu4fbbb2fdunVMnz6d++67D4CZM2cyc+ZMUlJS6Nu3b63bvvDCC8ycOZO0tDRSU1Pp168fsbGxDBkyhLS0NB5//PFq7V966SW2bdvGjz/+6Pq8ptICpZRS7dS3337LrbfeCsBtt93G119/7Vp+0003AbjWn2jixIn8/e9/57HHHmPHjh0EBgae9LMSExP57W9/i4+PfWKuW7duTc5fT/EppVRzauRpuNYkIg1ue+utt3L++efz0UcfMWXKFF5++WUGDx5cZ3tjTKPevyH0CEoppdqpCy+8kLfeeguA119/nYsvvhiACy64gHfffRfAtf5EWVlZDB48mPvuu4+IiAjWrVtHSEgIR44cqbX9lVdeyQsvvOCaV+rAgQNNzl8LlFJKtQPFxcX069fP9XjyySd5+umnefXVVxk9ejT/+c9/iIuLA+Cpp57iySefZMKECezZs4cuXWp27EhISGDUqFGMHTuWTZs2cfvttxMWFsZFF13EqFGj+MMf/lCt/Z133smAAQMYPXo0Y8aM4Y033mjyz6TTbSilVBO1tek2iouLCQwMRER46623ePPNN/nggw9a5bMbM92GXoNSSqkOZs2aNdxzzz0YYwgNDeWVV15xd0q10gKllFIdzCWXXMLatWvdnUa99BqUUko1g45wuaSpGvsdaYFSSqkmCggIID8/X4vUSRhjyM/PJyAgoMHb6Ck+pZRqon79+pGTk8P+/fvdnYpHCwgIoF+/fg1urwVKKaWayNfXl0GDBrk7jXbHI07xichNIrJBRCpFpEZXwyrttovIehFJExHtN66UUu2YpxxBpQM3AC82oO1lxpi8Fs5HKaWUm3lEgTLGZEDjxolSSinVvnlEgWoEA3wqIgZ40RjzUl0NRSQGiHGGhSKS2RoJtqDuQEc/ctTvwKbfg02/B1t7+B5Or21hqxUoEUkEetey6iFjTEPH2LjIGLNbRHoCK0VkkzHmy9oaOotXnQWsrRGR1NqGAulI9Duw6fdg0+/B1p6/h1YrUMaYyc3wHrudz/tE5D1gAlBrgVJKKdW2eUQvvoYQkU4iEnLsNXAlducKpZRS7ZBHFCgRuV5EcoCJwEcissK5vK+IfOxs1gv4WkTWAt8DHxljlrsnY7doN6crm0C/A5t+Dzb9Hmzt9nvoENNtKKWUans84ghKKaWUOpEWKKWUUh5JC1QbJCKzRcSISHd359LaRORxEdkkIutE5D0RCXV3Tq1JRK4SkUwR2SIiD7o7n9YmIv1FZJWIZDiHR5vp7pzcSUS8ReRHEfmfu3NpCVqg2hgR6Q9cAex0dy5ushIYZYwZDfwEzHFzPq1GRLyB54BwYCQwTURGujerVlcO/N4YMwK4AJjRAb+DqmYCGe5OoqVogWp7/gU8gD2qRodjjPnUGFPuDFcDDR+7v+2bAGwxxmQZY8qAt4Dr3JxTqzLG7DHG/OB8fQT7l/Np7s3KPUSkH/Bz4GV359JStEC1ISISAewyxnj+XM2t4w7gE3cn0YpOA7KrxDl00F/OACIyEDgH+M69mbjNU9h/rFa6O5GW0tbG4mv3TjYkFPAn7BuU27WGDIslIg9hn+55vTVzc7PaRlPukEfSIhIMvAvMMsYcdnc+rU1ErgH2GWPWiIjl7nxaihYoD1PXkFAicjYwCFjrHPW9H/CDiEwwxuS2Yootrr5hsUTkl8A1wCTTsW7kywH6V4n7AbvdlIvbiIgvdnF63Riz1N35uMlFQISIXA0EAJ1FJN4YE+XmvJqV3qjbRonIdmB8R5sbS0SuAp4ELjXGdKj5tUXEB7tjyCRgF5AC3GqM2eDWxFqR2H+dLQEOGGNmuTsfT+A8gpptjLnG3bk0N70GpdqaZ4EQ7NHs00TkBXcn1FqcnUPuAVZgdw54uyMVJ6eLgNuAy53//mnOowjVDukRlFJKKY+kR1BKKaU8khYopZRSHkkLlFJKKY+kBUoppZRH0gKllFLKI2mBUkop5ZG0QCmllPJIWqCUaibOObqeqBLPFpFHTtI+VETuPsn65GZOsd7PVMqTaIFSqvmUAjc0YiLJUKDOYmGMubBZsmrEZyrlSbRAKdV8yoGXgPtPXCEiUSLyvXNonhedkw/GAkOcyx6vZZtC5/NA5wyyi5yzyH4qIoHO5ZtEZIlzhuF3RCSoyjbpVd7r2NFcfZ/5eZUhhEpE5KZm+m6UajQtUEo1r+eA6SLS5dgCERkB3AJcZIwZC1QA04EHga3GmLHGmD/U877DgOeMMWcBh4CpzuVnAi85Zxg+TP1HRyf9TGPM5c4cXwQ+BDrqaOHKA2iBUqoZOecmeg24r8riScA4IEVE0pzx4Ea+9TZjTJrz9RpgoPN1tjHmG+freODiU8m7KhG5HXta+enGmIqmvp9Sp0rng1Kq+T0F/AC86owFWGKMmVO1kXNG2IYqrfK6Agh0vj5xtOdjcTnV/wANaMiHOE/pTQeuM8Y4GpGfUs1Oj6CUambGmAPA28CvnYs+A24UkZ4AItJNRE4HjmBPHdIUA0RkovP1NOBr5+u9QE8RCRMRf+wJHjnZZzpnab0buMEYU9LEvJRqMi1QSrWMJ4DuAMaYjcCfgU9FZB2wEuhjjMkHvhGR9No6LDRQBvBL5/t2A553fqYDeBT4DvgfsMm5/GSfuQR7lt5vnJ0kfo1SbqTzQSnVRjlPEf7PGDPKzako1SL0CEoppZRH0iMopZRSHkmPoJRSSnkkLVBKKaU8khYopZRSHkkLlFJKKY+kBUoppZRH0gKllFLKI2mBUkop5ZH+Hy+LZI8iEXAKAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "def tanh(z):\n",
    "    e_p = np.exp(z)\n",
    "    e_m = np.exp(-z)\n",
    "    return (e_p - e_m) / (e_p + e_m)\n",
    "\n",
    "z = np.arange(-5, 5, 0.005)\n",
    "log_act = logistic(z)\n",
    "tanh_act = tanh(z)\n",
    "plt.ylim([-1.5, 1.5])\n",
    "plt.xlabel('Net input $z$')\n",
    "plt.ylabel('Activation $\\phi(z)$')\n",
    "plt.axhline(1, color='black', linestyle=':')\n",
    "plt.axhline(0.5, color='black', linestyle=':')\n",
    "plt.axhline(0, color='black', linestyle=':')\n",
    "plt.axhline(-0.5, color='black', linestyle=':')\n",
    "plt.axhline(-1, color='black', linestyle=':')\n",
    "plt.plot(z, tanh_act,\n",
    "    linewidth=3, linestyle='--',\n",
    "    label='Tanh')\n",
    "plt.plot(z, log_act,\n",
    "    linewidth=3,\n",
    "    label='Logistic')\n",
    "plt.legend(loc='lower right')\n",
    "plt.tight_layout()\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-0.9999092 , -0.99990829, -0.99990737, ...,  0.99990644,\n",
       "        0.99990737,  0.99990829])"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.tanh(z)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<tf.Tensor: id=134681, shape=(2000,), dtype=float64, numpy=\n",
       "array([-0.9999092 , -0.99990829, -0.99990737, ...,  0.99990644,\n",
       "        0.99990737,  0.99990829])>"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import tensorflow as tf\n",
    "\n",
    "tf.keras.activations.tanh(z)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.00669285, 0.00672617, 0.00675966, ..., 0.99320669, 0.99324034,\n",
       "       0.99327383])"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from scipy.special import expit\n",
    "\n",
    "expit(z)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<tf.Tensor: id=134683, shape=(2000,), dtype=float64, numpy=\n",
       "array([0.00669285, 0.00672617, 0.00675966, ..., 0.99320669, 0.99324034,\n",
       "       0.99327383])>"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tf.keras.activations.sigmoid(z)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Rectified linear unit activation"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<tf.Tensor: id=134685, shape=(2000,), dtype=float64, numpy=array([0.   , 0.   , 0.   , ..., 4.985, 4.99 , 4.995])>"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import tensorflow as tf\n",
    "\n",
    "tf.keras.activations.relu(z)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Summary"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Appendix\n",
    "\n",
    "## Splitting a dataset: danger of mixing train/test examples"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{0, 1, 2, 3, 6, 7, 9, 10, 11, 13} {4, 5, 8, 12, 14}\n"
     ]
    }
   ],
   "source": [
    "## the correct way:\n",
    "ds = tf.data.Dataset.range(15)\n",
    "ds = ds.shuffle(15, reshuffle_each_iteration=False)\n",
    "\n",
    "\n",
    "ds_train = ds.take(10)\n",
    "ds_test = ds.skip(10)\n",
    "\n",
    "ds_train = ds_train.shuffle(10).repeat(10)\n",
    "ds_test = ds_test.shuffle(5)\n",
    "ds_test = ds_test.repeat(10)\n",
    "\n",
    "set_train = set()\n",
    "for i,item in enumerate(ds_train):\n",
    "    set_train.add(item.numpy())\n",
    "\n",
    "set_test = set()\n",
    "for i,item in enumerate(ds_test):\n",
    "    set_test.add(item.numpy())\n",
    "\n",
    "print(set_train, set_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14} {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}\n"
     ]
    }
   ],
   "source": [
    "## The wrong way:\n",
    "ds = tf.data.Dataset.range(15)\n",
    "ds = ds.shuffle(15, reshuffle_each_iteration=True)\n",
    "\n",
    "\n",
    "ds_train = ds.take(10)\n",
    "ds_test = ds.skip(10)\n",
    "\n",
    "ds_train = ds_train.shuffle(10).repeat(10)\n",
    "ds_test = ds_test.shuffle(5)\n",
    "ds_test = ds_test.repeat(10)\n",
    "\n",
    "set_train = set()\n",
    "for i,item in enumerate(ds_train):\n",
    "    set_train.add(item.numpy())\n",
    "\n",
    "set_test = set()\n",
    "for i,item in enumerate(ds_test):\n",
    "    set_test.add(item.numpy())\n",
    "\n",
    "print(set_train, set_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Splitting a dataset using `tfds.Split`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'features': <tf.Tensor: id=135251, shape=(4,), dtype=float32, numpy=array([6.1, 2.8, 4.7, 1.2], dtype=float32)>, 'label': <tf.Tensor: id=135252, shape=(), dtype=int64, numpy=1>}\n",
      "\n",
      "{'features': <tf.Tensor: id=135258, shape=(4,), dtype=float32, numpy=array([5.7, 3. , 4.2, 1.2], dtype=float32)>, 'label': <tf.Tensor: id=135259, shape=(), dtype=int64, numpy=1>}\n",
      "(<tf.Tensor: id=135303, shape=(4,), dtype=float32, numpy=array([6.8, 2.8, 4.8, 1.4], dtype=float32)>, <tf.Tensor: id=135304, shape=(), dtype=int64, numpy=1>)\n",
      "Training Set:  116 Test Set:  34\n",
      "10 12 12\n",
      "Training Set:  116 Test Set:  34\n",
      "10 12 12\n",
      "Training Set:  116 Test Set:  34\n",
      "10 12 12\n",
      "Training Set:  116 Test Set:  34\n",
      "10 12 12\n",
      "Training Set:  116 Test Set:  34\n",
      "10 12 12\n"
     ]
    }
   ],
   "source": [
    "\n",
    "##--------------------------- Attention ------------------------##\n",
    "##                                                              ##\n",
    "##     Note: currently, tfds.Split has a bug  in TF 2.0.0       ##\n",
    "##                                                              ##\n",
    "##  I.e., splitting [2, 1] is expected to result in             ##\n",
    "##      100 train and 50 test examples                          ##\n",
    "##                                                              ##\n",
    "##  but instead, it results in 116 train and 34 test examples   ##\n",
    "##                                                              ##\n",
    "##--------------------------------------------------------------##\n",
    "\n",
    "import tensorflow as tf\n",
    "import tensorflow_datasets as tfds\n",
    "import numpy as np\n",
    "\n",
    "##  method 1: specifying percentage:\n",
    "#first_67_percent = tfds.Split.TRAIN.subsplit(tfds.percent[:67])\n",
    "#last_33_percent = tfds.Split.TRAIN.subsplit(tfds.percent[-33:])\n",
    "\n",
    "#ds_train_orig = tfds.load('iris', split=first_67_percent)\n",
    "#ds_test = tfds.load('iris', split=last_33_percent)\n",
    "\n",
    "\n",
    "##  method 2: specifying the weights\n",
    "split_train, split_test = tfds.Split.TRAIN.subsplit([2, 1])\n",
    "\n",
    "ds_train_orig = tfds.load('iris', split=split_train)\n",
    "ds_test = tfds.load('iris', split=split_test)\n",
    "\n",
    "print(next(iter(ds_train_orig)))\n",
    "print()\n",
    "print(next(iter(ds_test)))\n",
    "\n",
    "\n",
    "ds_train_orig = ds_train_orig.shuffle(100, reshuffle_each_iteration=True)\n",
    "ds_test  = ds_test.shuffle(50, reshuffle_each_iteration=False)\n",
    "\n",
    "ds_train_orig = ds_train_orig.map(\n",
    "    lambda x: (x['features'], x['label']))\n",
    "\n",
    "ds_test = ds_test.map(\n",
    "    lambda x: (x['features'], x['label']))\n",
    "\n",
    "print(next(iter(ds_train_orig)))\n",
    "\n",
    "\n",
    "for j in range(5):\n",
    "    labels_train = []\n",
    "    for i,item in enumerate(ds_train_orig):\n",
    "        labels_train.append(item[1].numpy())\n",
    "\n",
    "    labels_test = []\n",
    "    for i,item in enumerate(ds_test):\n",
    "        labels_test.append(item[1].numpy())\n",
    "    print('Training Set: ',len(labels_train), 'Test Set: ', len(labels_test))\n",
    "\n",
    "    labels_test = np.array(labels_test)\n",
    "\n",
    "    print(np.sum(labels_test == 0), np.sum(labels_test == 1), np.sum(labels_test == 2))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<br>\n",
    "<br>\n",
    "<br>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "---\n",
    "\n",
    "Readers may ignore the next cell."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[NbConvertApp] Converting notebook ch13_part2.ipynb to script\n",
      "[NbConvertApp] Writing 14023 bytes to ch13_part2.py\n"
     ]
    }
   ],
   "source": [
    "! python ../.convert_notebook_to_script.py --input ch13_part2.ipynb --output ch13_part2.py"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.1"
  },
  "toc-showmarkdowntxt": false,
  "toc-showtags": false
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
